package servidor;

import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ServidorUDP extends Frame {

	private static final long serialVersionUID = 1L;

	private TextArea txtArea;

    private DatagramPacket paqEnviar, paqRecibir;
    private DatagramSocket socketEnviar, socketRecibir;

    ServidorUDP() {
        inicializaGUI();
        try {
            socketEnviar = new DatagramSocket();
            socketRecibir = new DatagramSocket(6500);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        
        addWindowListener(new WindowAdapter() {
    		public void windowClosing(WindowEvent e) {    		
    			socketEnviar.disconnect();
    			socketEnviar.close();    			
    			System.exit(0);
    		}
    	}); 
    }

    public static void main(String args[]) {
        ServidorUDP servidor = new ServidorUDP();
        servidor.esperarPaquetes();
    }
    
    void esperarPaquetes() {
        while (true) {
            try {
                byte array[] = new byte[100];
                paqRecibir = new DatagramPacket(array, array.length);
                socketRecibir.receive(paqRecibir);
                // ****** Se queda esperando
                muestraDatosRecibidos(array);                                               
                contestar();                
            } catch (IOException io) {
                io.printStackTrace();
            }
        }
    }

    private void muestraDatosRecibidos(byte[] array) {
    	txtArea.append("\nUn paquete recibido.");
        txtArea.append("\nLos datos del paquete son:");
        txtArea.append("\ndireccion: " + paqRecibir.getAddress());
        txtArea.append("\nPuerto   : " + paqRecibir.getPort());
        txtArea.append("\nLongitud : " + paqRecibir.getLength());
        txtArea.append("\nEl paquete contiene lo siguiente: \n");
        array = paqRecibir.getData();
        String datos = new String(array);
        txtArea.append(datos);		
	}

	private void contestar() {
    	txtArea.append("\nEnviado Ok al cliente...");
    	byte array[] = new byte[100];
        array = "Recibido correctamente".getBytes();
        
        paqEnviar = 
        	new DatagramPacket(
        		array, 
        		array.length, 
        		paqRecibir.getAddress(), 
        		6501);
        
        try {
			socketEnviar.send(paqEnviar);
			txtArea.append("\nPaquete enviado");
		} catch (IOException e) {			
			e.printStackTrace();
		}		
	}

	private void inicializaGUI() {
    	setTitle("Servidor UDP");
        txtArea = new TextArea(30, 40);
        txtArea.setEditable(false);
        add(txtArea);
        pack();
        setVisible(true);		
	}
}
